//JDBCMotirstaDAO.java
//Classe dao do Motorista para JDBC
package dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import modelo.Motorista;

/**
 * @author Diego Heusser
 * @author Eder Schramm
 */
public class JDBCMotoristaDAO extends JDBCDAO implements MotoristaDAO {

    @Override
    public boolean inserir(Motorista umMotorista) {
        try {
            String insereSQL = "INSERT INTO Motorista (id, nome, habilitacao, genero, datanascimento) "
                    + "VALUES(?,?,?,?,?)";
            insere(insereSQL, umMotorista.getId(), umMotorista.getNome(),
                    umMotorista.getHabilitacao(), umMotorista.getGenero(),
                    umMotorista.getDataNascimento());
            return true;
        } catch (SQLException e) {
            return false;
        }
    }

    @Override
    public boolean alterar(Motorista umMotorista) {
        try {
            String alteraSQl = "UPDATE Motorista SET nome = ?, habilitacao = ?, "
                    + "genero = ?, datanascimento = ? "
                    + "WHERE id = ?";
            altera(alteraSQl, umMotorista.getId(), umMotorista.getNome(),
                    umMotorista.getHabilitacao(), umMotorista.getGenero(),
                    umMotorista.getDataNascimento());
            return true;
        } catch (SQLException e) {
            return false;
        }
    }

    @Override
    public boolean remover(int id) {
        try {
            String remove = "DELETE FROM Motorista WHERE id = ?";
            remove(remove, id);
            return true;
        } catch (SQLException e) {
            return false;
        }
    }

    @Override
    public List<Motorista> listar() {
        try {
            List<Motorista> lista = new ArrayList<>();
            String select = "SELECT * FROM Motorista ORDER BY nome";
            Statement stmt = getConexao().createStatement();
            ResultSet rs = stmt.executeQuery(select);

            while (rs.next()) {
                Motorista umMotorista = new Motorista();
                umMotorista.setDataNascimento(rs.getDate("datanascimento"));
                umMotorista.setGenero(rs.getString("genero"));
                umMotorista.setHabilitacao(rs.getString("habilitacao"));
                umMotorista.setId(rs.getInt("id"));
                umMotorista.setNome(rs.getString("nome"));
                lista.add(umMotorista);
            }
            return lista;
        } catch (SQLException e) {
            return null;
        }
    }

    @Override
    public List<Motorista> listarFisico() {
        throw new UnsupportedOperationException("Não é possível listar físico com JDBC.");
    }

    @Override
    public boolean idValido(int id) {
        try {
            List<Motorista> lista = new ArrayList<>();
            String select = "SELECT * FROM Motorista WHERE id = " + id + " ";
            Statement stmt = getConexao().createStatement();
            ResultSet rs = stmt.executeQuery(select);
            return !rs.next();
        } catch (SQLException e) {
            return false;
        }
    }

    @Override
    public List<Motorista> listar(String nome) {
        try {
            List<Motorista> lista = new ArrayList<>();
            String select = "SELECT * FROM Motorista WHERE nome LIKE '" + nome + "%'";
            Statement stmt = getConexao().createStatement();
            ResultSet rs = stmt.executeQuery(select);

            while (rs.next()) {
                Motorista umMotorista = new Motorista();
                umMotorista.setDataNascimento(rs.getDate("datanascimento"));
                umMotorista.setGenero(rs.getString("genero"));
                umMotorista.setHabilitacao(rs.getString("habilitacao"));
                umMotorista.setId(rs.getInt("id"));
                umMotorista.setNome(rs.getString("nome"));
                lista.add(umMotorista);
            }
            return lista;
        } catch (SQLException e) {
            return null;
        }
    }

    public Motorista listar(int id) {
        try {
            Motorista umMotorista = new Motorista();
            String select = "SELECT * FROM Motorista WHERE id = " + id + "";
            Statement stmt = getConexao().createStatement();
            ResultSet rs = stmt.executeQuery(select);

            while (rs.next()) {
                umMotorista.setId(rs.getInt("id"));
                umMotorista.setDataNascimento(rs.getDate("datanascimento"));
                umMotorista.setGenero(rs.getString("genero"));
                umMotorista.setHabilitacao(rs.getString("habilitacao"));
                umMotorista.setNome(rs.getString("nome"));
            }
            return umMotorista;
        } catch (SQLException e) {
            return null;
        }
    }

    @Override
    public boolean apagarDados() {
        try {
            String delete = "DELETE FROM Motorista";
            Statement stmt = getConexao().createStatement();
            stmt.executeQuery(delete);
            return true;
        } catch (Exception ex) {
            return false;
        }
    }

    @Override
    public boolean criarTabela() throws SQLException {
        String ddl = "CREATE TABLE Motorista("
                + "	id INT CONSTRAINT nn_Motorista_id NOT NULL,"
                + "	nome VARCHAR(50) CONSTRAINT nn_Motorista_nome NOT NULL,"
                + "	habilitacao VARCHAR(30) CONSTRAINT nn_Motorista_habilitacao NOT NULL,"
                + "	genero VARCHAR(30) CONSTRAINT nn_Motorista_genero NOT NULL,"
                + "	dataNascimento DATE CONSTRAINT nn_Motorista_idade NOT NULL,"
                + "	CONSTRAINT pk_Motorista PRIMARY KEY(id)"
                + ")";
        Statement stmt = getConexao().createStatement();
        stmt.execute(ddl);
        
        String[] comentarios = new String[6];
        comentarios[0] = "COMMENT ON TABLE Motorista IS 'Tabela para guadar os dados do motorista'";
        comentarios[1] = "COMMENT ON COLUMN Motorista.id IS 'Campo chave da tabela Motorista'";
        comentarios[2] = "COMMENT ON COLUMN Motorista.nome IS 'Campo para guadar o nome do motorista'";
        comentarios[3] = "COMMENT ON COLUMN Motorista.habilitacao IS 'Campo para guadar a habilitação do motorista'";
        comentarios[4] = "COMMENT ON COLUMN Motorista.genero IS 'Campo para guadar o gênero do motorista'";
        comentarios[5] = "COMMENT ON COLUMN Motorista.dataNascimento IS 'Campo para guadar a data de nascimento do motorista'";
        for (int i = 0; i < comentarios.length; i++) {
            stmt.execute(comentarios[i]);
        }
        stmt.close();
        return true;
    }

}
